home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
nan_news
/
toolkit
/
scregion.prg
< prev
next >
Wrap
Text File
|
1991-08-15
|
9KB
|
226 lines
/*
* File......: SCREGION.PRG
* Author....: David A. Richardson
* Date......: $Date: 15 Aug 1991 23:05:46 $
* Revision..: $Revision: 1.2 $
* Log file..: $Logfile: E:/nanfor/src/scregion.prv $
*
* This is an original work by David A. Richardson and is hereby placed
* in the public domain.
*
* Modification history:
* ---------------------
*
* $Log: E:/nanfor/src/scregion.prv $
*
* Rev 1.2 15 Aug 1991 23:05:46 GLENN
* Forest Belt proofread/edited/cleaned up doc
*
* Rev 1.1 14 Jun 1991 19:52:56 GLENN
* Minor edit to file header
*
* Rev 1.0 01 Apr 1991 01:02:14 GLENN
* Nanforum Toolkit
*
*/
/* $DOC$
* $FUNCNAME$
* FT_SAVRGN()
* $CATEGORY$
* Video
* $ONELINER$
* Save a screen region for later display
* $SYNTAX$
* FT_SAVRGN( <nTop>, <nLeft>, <nBottom>, <nRight> ) -> cScreen
* $ARGUMENTS$
* <nTop>, <nLeft>, <nBottom>, and <nRight> define the portion of the
* screen to save. Allowable values are 0 through 255.
* $RETURNS$
* FT_SAVRGN() returns the saved screen region and its coordinates
* as a character string.
* $DESCRIPTION$
* FT_SAVRGN() is similar to Clipper's SAVESCREEN(), but it saves the
* screen coordinates as well as the display information. The saved
* area can be restored by passing the returned string to FT_RSTRGN().
*
* Note that the strings returned from FT_SAVRGN() and Clipper's
* SAVESCREEN() are not interchangeable. A screen region saved with
* with FT_SAVRGN() must be restored using FT_RSTRGN().
*
* FT_SAVRGN() calls Clipper's SAVESCREEN(). Refer to the Clipper
* documentation for more information regarding this function.
* $EXAMPLES$
* The following example uses FT_SAVRGN() and FT_RSTRGN() to save
* and restore a portion of the screen.
*
* @ 00, 00, 24, 79 BOX "111111111" // fill the screen with 1's
* cScreen = FT_SAVRGN(10, 10, 20, 30) // save a region
* @ 00, 00, 24, 79 BOX "222222222" // fill the screen with 2's
* FT_RSTRGN(cScreen) // restore the 1's region
* $SEEALSO$
* FT_RSTRGN() FT_RGNSTACK()
* $END$
*/
FUNCTION FT_SAVRGN(nTop, nLeft, nBottom, nRight)
RETURN (CHR(nTop) + CHR(nLeft) + CHR(nBottom) + CHR(nRight) + ;
SAVESCREEN(nTop, nLeft, nBottom, nRight))
/* $DOC$
* $FUNCNAME$
* FT_RSTRGN()
* $CATEGORY$
* Video
* $ONELINER$
* Restore region of the screen saved with FT_SAVRGN()
* $SYNTAX$
* FT_RSTRGN( <cScreen>, [ <nTop> ], [ <nLeft> ] ) -> NIL
* $ARGUMENTS$
* <cScreen> is a screen region previously returned from FT_SAVRGN().
*
* <nTop> and <nLeft> are optional parameters that define a new location
* for the upper left corner of the screen area contained in <cScreen>.
* Allowable values are 0 through 255.
* $RETURNS$
* FT_RSTRGN() returns NIL.
* $DESCRIPTION$
* FT_RSTRGN() restores a screen region previously saved with
* FT_SAVRGN(). Calling FT_RSTRGN() with <cScreen> as the only
* parameter will restore the saved region to its original location.
* <nTop> and <nLeft> may be used to define a new location for the
* upper left corner of the saved region.
*
* <nTop> and <nLeft> are dependent upon each other. You may not
* specify one without the other.
*
* FT_RSTRGN() calls Clipper's RESTSCREEN(). Refer to the Clipper
* documentation for more information regarding this function.
* $EXAMPLES$
* The following example uses FT_RSTRGN() to restore a saved portion
* of the screen to different locations.
*
* @ 00, 00, 24, 79 BOX "111111111" // fill the screen with 1's
* cScreen = FT_SAVRGN(10, 10, 20, 30) // save a region
* @ 00, 00, 24, 79 BOX "222222222" // fill the screen with 2's
* FT_RSTRGN(cScreen) // restore the 1's region
* @ 00, 00, 24, 79 BOX "222222222" // fill the screen with 2's
* FT_RSTRGN(cScreen, 15, 15) // restore to a different location
* @ 00, 00, 24, 79 BOX "222222222" // fill the screen with 2's
* FT_RSTRGN(cScreen, 20, 60) // restore to a different location
* $SEEALSO$
* FT_SAVRGN() FT_RGNSTACK()
* $END$
*/
FUNCTION FT_RSTRGN(cScreen, nTop, nLeft)
IF PCOUNT() == 3
RESTSCREEN(nTop, nLeft, (nTop - ASC(cScreen)) + ASC(SUBSTR(cScreen, 3)), ;
(nLeft - ASC(SUBSTR(cScreen, 2))) + ASC(SUBSTR(cScreen, 4)), ;
SUBSTR(cScreen, 5))
ELSE
RESTSCREEN(ASC(cScreen), ASC(SUBSTR(cScreen, 2)), ASC(SUBSTR(cScreen, 3)), ;
ASC(SUBSTR(cScreen, 4)), SUBSTR(cScreen, 5))
ENDIF
RETURN NIL
/* $DOC$
* $FUNCNAME$
* FT_RGNSTACK()
* $CATEGORY$
* Video
* $ONELINER$
* Push or pop a saved screen region on or off the stack
* $SYNTAX$
* FT_RGNSTACK( <cAction>, [ <nTop> ], [ <nLeft> ], [ <nBottom> ],
* [ <nRight> ] ) -> NIL
* $ARGUMENTS$
* <cAction> determines what action FT_RGNSTACK() will take. The
* allowable values for this parameter are "push", "pop", and "pop all".
* If the function is called with any other string as the first parameter
* no action is performed.
*
* <cAction> with a value of "push" will push a saved screen region onto
* the stack. A value of "pop" will restore the most recently pushed
* screen region. "pop all" tells the function to restore all screen
* images which are currently on the stack.
*
* The use of <nTop>, <nLeft>, <nBottom>, and <nRight> depends on the
* <cAction> parameter. If <cAction> is "push", the next four parameters
* define the screen region to save. If <cAction> is "pop" or "pop all"
* the following four parameters are ignored.
* $RETURNS$
* FT_RGNSTACK() returns NIL.
* $DESCRIPTION$
* FT_RGNSTACK() allows multiple screens to be saved and restored from
* a stack. The stack is implemented with Clipper static array that is
* visible only to FT_RGNSTACK().
*
* The purpose of FT_RGNSTACK() is to allow multiple screen regions to be
* managed without the need to remember the original coordinates or to
* create variables for each one.
*
* When called with "push", FT_RGNSTACK() places the saved screen area
* at the end of the static array. The array size is incremented by one
* to accommodate the new screen area.
*
* When called with "pop", the function restores the screen image stored
* in the last element of the array, and the array size is decremented by
* one. If "pop all" is specified, all the saved screens are restored
* until the array is empty.
*
* FT_RGNSTACK() calls FT_SAVRGN() and FT_RSTRGN(). Refer to the
* documentation for these two functions for more information.
* $EXAMPLES$
* The following example uses FT_RGNSTACK() to save and restore various
* sections of the screen.
*
* @ 00, 00, 24, 79 BOX "111111111" // fill the screen with 1's
* FT_RGNSTACK("push", 10, 05, 15, 15) // push a region
* @ 00, 00, 24, 79 BOX "222222222" // fill the screen with 2's
* FT_RGNSTACK("push", 10, 20, 15, 30) // push a region
* @ 00, 00, 24, 79 BOX "333333333" // fill the screen with 3's
* FT_RGNSTACK("push", 10, 35, 15, 45) // push a region
* @ 00, 00, 24, 79 BOX "444444444" // fill the screen with 4's
* FT_RGNSTACK("push", 10, 50, 15, 60) // push a region
* @ 00, 00, 24, 79 BOX "555555555" // fill the screen with 5's
* FT_RGNSTACK("push", 10, 65, 15, 75) // push a region
* CLEAR
* FT_RGNSTACK("pop") // restore the 5's region
* FT_RGNSTACK("pop") // restore the 4's region
* FT_RGNSTACK("pop all") // restore the 3's, 2's and 1's regions
* $SEEALSO$
* FT_SAVRGN() FT_RSTRGN()
* $END$
*/
FUNCTION FT_RGNSTACK(cAction, nTop, nLeft, nBottom, nRight)
STATIC aRgnStack_[0], nStackPtr := 0
LOCAL nPopTop
IF cAction == "push"
ASIZE(aRgnStack_, ++nStackPtr)[nStackPtr] = ;
FT_SAVRGN(nTop, nLeft, nBottom, nRight)
ELSEIF cAction == "pop" .OR. cAction = "pop all"
nPopTop = IIF("all" $ cAction, 0, nStackPtr-1)
DO WHILE nStackPtr > nPopTop
FT_RSTRGN(aRgnStack_[nStackPtr--])
ENDDO
ASIZE(aRgnStack_, nStackPtr)
ENDIF
RETURN NIL